home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Purity
/
Purity #34 (1994-08)(Diesel)(DE)[WB].zip
/
Purity #34 (1994-08)(Diesel)(DE)[WB].adf
/
Cheque2.06
/
Cheque2.06.p
< prev
next >
Wrap
Text File
|
1994-08-06
|
19KB
|
625 lines
{ Cheque 2.06: Eurochequebedruckprogramm (fontsensitiv/auslesen der Batt-
Clock/einfach aber nett/benutzt die Gadtools.lib/Reqtools.lib
Das Programm ist Freeware. Es müssen folgenden Datein, inkl. deren
Icons enthalten sein:Cheque2.06, Anleitung, Cheque2.06.p (nur Purity)
Weitere Bedingungen / Einschränkungen in der Anleitung
Erstellt mit KickPascal 2.12 von Maxon Computer GmbH
Programmierer: Falk Zühlsdorff (PackMAN)
Lindenberg 66
98693 Ilmenau / Thüringen }
Program cheque;
USES Reqtools4,Gadtools,BATTCLOCKLIGHT,PrtChk;
{$ incl "dos.lib"};
TYPE helpstr = string;
strtype = string[200];
VAR PScr : p_screen;
drawinfo : p_drawinfo;
txattr : TextAttr;
font : p_textfont;
ysize,ScrTextFont,
Winbreite : word;
baseline,rem : word;
Wbr : integer;
ourfont,RT,mIDCMP : long;
ALLOK,ex,dos,help : boolean;
Win : ^Window;
RP : ^RastPort;
msg : ^IntuiMessage;
akt : ^Gadget;
NWTags : array[1..13] OF tagitem;
titel : string;
gfx : long;
pgad,glist : p_Gadget;
vi : PTR;
fontname : string;
i : byte;
Vorab : boolean;
{****************}
ng : NewGadget;
g : array[0..12] OF p_Gadget;STATIC;
GTags : array[0..2] OF TagItem;STATIC;
cfeld : array[0..6] OF ^helpstr; {@-Gads}
CTx : array[0..2] OF string;
cycleNr : byte;
CTags : array[0..3] OF TagItem;STATIC;
STx : array[0..6] OF string;
STagsA,STagsB,
STagsC,STagsD,
STagsE,STagsF,
STagsG : array[0..4] OF TagItem;
StrAkt : boolean;
sig : ^stringinfo;
TTx : array[0..5] OF string;
TTags : array[0..3] OF TagItem;
ReqInfo : p_rtReqInfo;
{-------------------------------------------------------------------------}
PROCEDURE abschalten;
BEGIN
mIDCMP:=Win^.IDCMPFlags;
help:=ModifyIDCMP(Win,0);
rem:=RemoveGList(Win,g[0],13);
END;
{-------------------------------------------------------------------------}
PROCEDURE zuschalten;
BEGIN
help:=ModifyIDCMP(Win,mIDCMP);
rem:=AddGList(Win,g[0],0,13,nil);
END;
{-------------------------------------------------------------------------}
FUNCTION RTReq(Titel,Text,gadtx:string,Pos:byte):long;
VAR tags : array[0..7] of tagitem;STATIC;
BEGIN
Tags[0]:=TagItem(RTEZ_Reqtitle,Long(^titel));
Tags[1]:=TagItem(RTGS_GadFmt,long(^gadtx));
Tags[2]:=TagItem(RT_UnderScore,long('_'));
Tags[3]:=TagItem(RTGS_BackFill,long(false));
Tags[4]:=TagItem(RT_ReqPos,Pos);
Tags[5]:=TagItem(RTGS_Flags,GSREQF_CENTERTEXT or GSREQF_HIGHLIGHTTEXT);
Tags[6]:=TagItem(RT_Window,long(Win));
Tags[7].ti_tag:=Tag_END;
RTReq:=rtEZRequestA(^Text,^gadtx,NIL,NIL,^Tags[0]);
END;
{-------------------------------------------------------------------------}
FUNCTION RTReq2(Titel:string,Text:strtype,gadtx:string,Pos,left,
top:long):long;
VAR tags : array[0..10] of tagitem;STATIC;
BEGIN
Tags[0]:=TagItem(RTEZ_Reqtitle,Long(^titel));
Tags[1]:=TagItem(RTGS_GadFmt,long(^gadtx));
Tags[2]:=TagItem(RT_UnderScore,long('_'));
Tags[3]:=TagItem(RTGS_BackFill,long(false));
Tags[4]:=TagItem(RT_ReqPos,Pos);
Tags[5]:=TagItem(RT_LeftOffset,left);
Tags[6]:=TagItem(RT_TopOffset,top);
Tags[7]:=TagItem(RT_TextAttr,long(^txattr));
Tags[8]:=TagItem(RTGS_Flags,GSREQF_CENTERTEXT or GSREQF_HIGHLIGHTTEXT);
Tags[9]:=TagItem(RT_Window,long(Win));
Tags[10].ti_tag:=Tag_END;
RTReq2:=rtEZRequestA(^Text,^gadtx,NIL,NIL,^Tags[0]);
END;
{-------------------------------------------------------------------------}
FUNCTION RTReqFirst(Titel,Text,gadtx:string):long;
VAR tags : array[0..6] of tagitem;
BEGIN
Tags[0]:=TagItem(RTEZ_Reqtitle,Long(^titel));
Tags[1]:=TagItem(RTGS_GadFmt,long(^gadtx));
Tags[2]:=TagItem(RT_UnderScore,long('_'));
Tags[3]:=TagItem(RTGS_BackFill,long(false));
Tags[4]:=TagItem(RT_ReqPos,ReqPos_TopLeftScr); {4}
Tags[5]:=TagItem(RTGS_Flags,GSREQF_CENTERTEXT or GSREQF_HIGHLIGHTTEXT);
Tags[6].ti_tag:=Tag_END;
RTReqFirst:=rtEZRequestA(^Text,^gadtx,NIL,NIL,^Tags[0]);
END;
{------------------------------------------------------------------------}
PROCEDURE InfoLine;
CONST up:=chr(10);
BEGIN
abschalten;
RT:=RTReq2('Information',
'Druckprogramm für Eurocheques.'+up+up+
'FREEWARE - KickPascal 2.12/OS2'+up+up+
'© & P by'+up+
'(PackMAN) Falk Zühlsdorff'+up+
'Lindenberg 66'+up+
'D-98693 Ilmenau / Thüringen'+up+up+
'Reqtools.library © by N.François',
'_OK',5,Win^.LeftEdge+20*Wbr,Win^.Topedge);
zuschalten;
END;
{-------------------------------------------------------------------------}
PROCEDURE Topaz8;
BEGIN
fontname:='topaz.font';
ysize:=8;
WBr:=8;
txattr:=TextAttr(fontname,ysize,0,0);
Font:=OpenFont(^txattr);
END;
{-------------------------------------------------------------------------}
PROCEDURE Neu;
BEGIN
STx[0]:='';STx[1]:='';STx[2]:='DM';STx[3]:='';
GT_SetGadgetAttrsA(g[0],Win,NIL,^STagsA[3]);
GT_SetGadgetAttrsA(g[1],Win,NIL,^STagsB[3]);
GT_SetGadgetAttrsA(g[2],Win,NIL,^STagsC[3]);
GT_SetGadgetAttrsA(g[3],Win,NIL,^STagsD[3]);
END;
{-------------------------------------------------------------------------}
PROCEDURE GetStrGaddata; {my fantastic methode}
BEGIN
FOR i:=0 TO 6 DO
BEGIN
sig:=g[i]^.SpecialInfo;
STx[i]:=sig^.buffer;
END;
END;
{------------------------------------------------------------------------}
PROCEDURE Drucken;
CONST ESC:=CHR(27);
Test:='PRT:';
VAR LST : text;STATIC;
outfile : BPTR;STATIC;
anzahl,abc : long;STATIC;
strg : String[2];STATIC;
x,j : byte;
endlich : boolean;
FUNCTION check:boolean;
VAR ok:byte;
BEGIN
ok:=CheckPrt;
CASE ok OF
0: check:=true;
1: BEGIN RT:=RTReq('Cheque 2.06',
'Drucker: offline','_JA',4); check:=false;
zuschalten;
END;
2: BEGIN RT:=RTReq('Cheque 2.06',
'Drucker: kein Papier','_JA',4); check:=false;
zuschalten;
END;
3: BEGIN RT:=RTReq('Cheque 2.06',
'Drucker: offline/kein Papier','_JA',4); check:=false;
Zuschalten;
END;
ELSE;END;
END;
{---OF Drucken----}
BEGIN
abschalten;
endlich:=false;
GetStrGaddata;
IF NOT Check THEN EXIT;
strg:=' ';
outfile:=Open(Test,Mode_OLDFILE); {Drucker ansprechen}
IF outfile<>0 THEN
BEGIN
anzahl:=dosWrite(outfile,^strg,3); {Online okay ... Test2 for fucking }
IF anzahl=3 THEN {Printers,like mine C=1550C}
BEGIN
abc:=DOSClose(outfile);
Rewrite(LST,'PRT:');
IF IOResult=0 THEN
BEGIN
write(LST,ESC,'#1',ESC,'[2"z',ESC,'[0m',ESC,'[4w',
ESC,'[1p',ESC,'[0z');
IF cycleNr=1
THEN writeln(LST,' NUR ZUR VERRECHNUNG')
ELSE writeln(LST);
writeln(LST);
writeln(LST);
x:=STRLEN(STx[0]);
x:=50-x+8;
write(LST,STx[0]);
IF x>0 THEN for j:=1 to x do write(LST,' ');
write(LST,STx[2]);
x:=STRLEN(STx[2]); IF x<3 THEN for j:=1 to x do write(LST,' ');
writeln(LST,' =',STx[3]);
writeln(LST);
writeln(LST);
x:=STRLEN(STx[1]);
x:=50-x+8;
write(LST,STx[1]);
IF x>0 THEN for j:=1 to x do write(LST,' ');
writeln(LST,STx[4]);
writeln(LST);
writeln(LST,
' ',
STx[5]);
close(LST);
endlich:=true;
END ELSE abc:=DosClose(Outfile);
END ELSE abc:=DosClose(Outfile);
END ELSE abc:=DosClose(Outfile);
IF endlich THEN
BEGIN
RT:=RTReq('Cheque 2.06','Rückseite (KartenNr) drucken ?','_Jetzt|_Stop !',4);
IF RT=1 THEN
BEGIN
IF NOT Check THEN EXIT;
strg:=' ';
outfile:=Open(Test,Mode_OLDFILE);
IF outfile<>0 THEN
BEGIN
anzahl:=dosWrite(outfile,^strg,3);
IF anzahl=3
THEN BEGIN
abc:=DOSClose(outfile);
Rewrite(LST,'PRT:');
IF IOResult=0 THEN
BEGIN
write(LST,ESC,'#1',ESC,'[2"z',ESC,'[0m',ESC,'[4w',
ESC,'[1p',ESC,'[0z');
FOR i:=1 TO 6 DO
writeln(LST);
writeln(LST,' ',STx[6]);
Close(LST);
delay(25*3);
END
ELSE RT:=RTReq('Cheque 2.06','KartenNr nicht druckbar',
'_Na Gut !',4);
END
ELSE
BEGIN
abc:=DOSClose(outfile);
RT:=RTReq('Cheque 2.06','KartenNr nicht druckbar',
'_Na Gut !',4);
END;
END
ELSE abc:=DosClose(Outfile);
END;
END;
zuschalten;
END;
{-------------------------------------------------------------------------}
PROCEDURE Speichern;
VAR f:text;
BEGIN
GetStrGaddata;
rewrite(f,'SYS:S/Cheque2.06.con');
IF IOResult=0
THEN BEGIN
writeln(f,'Ch2.06Data');
writeln(f,STx[4]);
writeln(f,STx[6]);
close(f);
END;
END;
{-------------------------------------------------------------------------}
PROCEDURE Laden;
VAR f :text;
buf:string;
BEGIN
assign(f,'SYS:S/Cheque2.06.con');
reset(f);
IF IOResult=0
THEN BEGIN
readln(f,buf);
IF buf<>'Ch2.06Data'
THEN
BEGIN STx[6]:='';Stx[4]:=''; close(f); END
ELSE
BEGIN
readln(f,STx[4]);
readln(f,STx[6]);
close(f);
END;
END;
END;
{-------------------------------------------------------------------------}
PROCEDURE cycle(taste:byte);
BEGIN
IF cycleNr=0 THEN INC(cycleNr) ELSE DEC(cycleNr);
IF taste=1 THEN
BEGIN
CTags[0]:=TagItem(GTCY_Active,cycleNr);
GT_SetGadgetAttrsA(g[7],Win,NIL,^CTags[0]);
END;
END;
{-------------------------------------------------------------------------}
PROCEDURE InitWin;
BEGIN
ALLOK:=false;
Vorab:=false;
PScr:=NIL;
PScr:=lockpubscreen(NIL);
IF PScr<>NIL THEN
BEGIN
drawinfo:=getscreendrawinfo(PScr);
IF drawinfo<>NIL THEN
BEGIN
font:=drawinfo^.dri_font;
ysize:=font^.tf_ysize;
ScrTextFont:=ysize;
baseline:=font^.tf_baseline;
Wbr:=textlength(^PScr^.rastport,'W',1);
Winbreite:=textlength(^PScr^.rastport,
'Erstellt in KickPascal 2.12/OS2-Includes von Maxon-Computer GmbHwwwwwwwwwwwwwwww',80);
vi:=GetVisualinfoA(PScr,nil);
IF (Winbreite>Pscr^.width) OR (17*ysize>Pscr^.height) THEN VORAB:=true;
freescreendrawinfo(PScr,drawinfo);
UnlockPubScreen(NIL,PScr);
Pgad:=NIL;
Pgad:=CreateContext(^Glist);
IF pgad<>nil
THEN
BEGIN
fontname:=drawinfo^.dri_font^.tf_Message.mn_Node.ln_Name;
txattr:=TextAttr(fontname,ysize,0,0);
IF Vorab THEN
BEGIN
RT:=RTReqFirst('Cheque 2.06 Vorab:',
'Ungünstiges Verhältnis'\10'Screenfont : Screengröße',
'_Topaz 8|_Ende');
IF RT=1 THEN topaz8
ELSE
BEGIN
FreeGadgets(glist);
FreeVisualInfo(vi);
CloseSomeLibs;
help:=CloseUtility;
exit;
END;
END;
ALLOK:=true;
END;
IF ALLOK=false
THEN
BEGIN
RT:=RTReq('Cheque 2.06','Kann Programm nicht starten.',
'_Argh',4);
exit;
END;
FOR i:=0 TO 1 DO STx[i]:='';
Stx[2]:='DM';
STx[3]:='';
STagsA[0]:=TagItem(GT_Underscore,ord('_'));
STagsA[1]:=TagItem(GTST_MaxChars,50); {in W}
STagsA[2]:=TagItem(GA_TabCycle,ord(true));
STagsA[3]:=TagItem(GTST_String,long(^STx[0]));
STagsA[4].ti_tag:=Tag_Done;
STagsB[0]:=STagsA[0];
STagsB[1]:=STagsA[1]; {an}
STagsB[2]:=STagsA[2];
STagsB[3]:=TagItem(GTST_String,long(^STx[1]));
STagsB[4].ti_tag:=Tag_Done;
STagsC[0]:=STagsA[0];
STagsC[1]:=TagItem(GTST_MaxChars,4);
STagsC[2]:=STagsA[2]; {Währ.}
STagsC[3]:=TagItem(GTST_String,long(^STx[2]));
STagsC[4].ti_tag:=Tag_Done;
STagsD[0]:=STagsA[0];
STagsD[1]:=TagItem(GTST_MaxChars,10); {Betrag}
STagsD[2]:=STagsA[2];
STagsD[3]:=TagItem(GTST_String,long(^STx[3]));
STagsD[4].ti_tag:=Tag_Done;
STagsE[0]:=STagsA[0];
STagsE[1]:=TagItem(GTST_MaxChars,20); {Ort}
STagsE[2]:=STagsA[2];
STagsE[3]:=TagItem(GTST_String,long(^STx[4]));
STagsE[4].ti_tag:=Tag_Done;
STagsF[0]:=STagsA[0];
STagsF[1]:=TagItem(GTST_MaxChars,10);
STagsF[2]:=STagsA[2]; {Datum}
STagsF[3]:=TagItem(GTST_String,long(^STx[5]));
STagsF[4].ti_tag:=Tag_Done;
STagsG[0]:=STagsA[0];
STagsG[1]:=TagItem(GTST_MaxChars,13);
STagsG[2]:=STagsA[2]; {KNr.}
STagsG[3]:=TagItem(GTST_String,long(^STx[6]));
STagsG[4].ti_tag:=Tag_Done;
Ctx[0]:='Barcheque'; Ctx[1]:='nur zur Verrechnung';
cfeld[0]:=^CTx[0];
cfeld[1]:=^Ctx[1];
cfeld[2]:=NIL;
CTags[0]:=TagItem(GTCY_Active,0);
CTags[1]:=TagItem(GTCY_LABELS,long(^cfeld));
CTags[2]:=TagItem(GT_Underscore,ord('_'));
CTags[3].ti_Tag:=Tag_Done;
GTags[0]:=TagItem(GT_Underscore,ord('_'));
GTags[1].ti_Tag:=Tag_Done;
ng:=NewGadget(13*Wbr,ScrTextFont+ysize,53*Wbr,ysize+6,'in _Worten:',
^txattr,0,PLACETEXT_LEFT,vi,nil);
pgad:=CreateGadgetA(STRING_KIND,pgad,^ng,^STagsA[0]);
g[0]:=pgad;
ng.ng_TopEdge:=ScrTextFont+3*ysize;
ng.ng_GadgetID:=1;
ng.ng_GadgetText:='_an / für:';
pgad:=CreateGadgetA(STRING_KIND,pgad,^ng,^STagsB[0]);
g[1]:=pgad;
ng.ng_TopEdge:=ScrTextFont+5*ysize;
ng.ng_GadgetID:=2;
ng.ng_Width:=5*Wbr;
ng.ng_GadgetText:='W_ährung:';
pgad:=CreateGadgetA(STRING_KIND,pgad,^ng,^STagsC[0]);
g[2]:=pgad;
ng.ng_LeftEdge:=28*WBR;
ng.ng_GadgetID:=3;
ng.ng_Width:=13*Wbr;
ng.ng_GadgetText:='_Betrag:';
pgad:=CreateGadgetA(STRING_KIND,pgad,^ng,^STagsD[0]);
g[3]:=pgad;
ng.ng_LeftEdge:=48*WBr;
ng.ng_GadgetID:=4;
ng.ng_Width:=18*Wbr;
ng.ng_GadgetText:='_Ort:';
pgad:=CreateGadgetA(STRING_KIND,pgad,^ng,^STagsE[0]);
g[4]:=pgad;
ng.ng_TopEdge:=ScrTextFont+7*ysize;
ng.ng_LeftEdge:=13*Wbr;
ng.ng_GadgetID:=5;
ng.ng_Width:=13*Wbr;
ng.ng_GadgetText:='Da_tum:';
pgad:=CreateGadgetA(STRING_KIND,pgad,^ng,^STagsF[0]);
g[5]:=pgad;
ng.ng_LeftEdge:=48*Wbr;
ng.ng_GadgetID:=6;
ng.ng_Width:=18*Wbr;
ng.ng_GadgetText:='Ka_rtenNummer.:';
pgad:=CreateGadgetA(STRING_KIND,pgad,^ng,^STagsG[0]);
g[6]:=pgad;
ng:=NewGadget(28*Wbr,ScrTextFont+10*ysize,26*Wbr,ysize+6,'_Verwendung',
^txattr,7,PLACETEXT_LEFT,vi,nil);
pgad:=CreateGadgetA(CYCLE_KIND,pgad,^ng,^CTags[0]);
g[7]:=pgad;
ng:=NewGadget(13*WBr,ScrTextFont+13*ysize,11*Wbr,ysize+6,'_Info',
^txattr,8,PLACETEXT_IN,vi,nil);
pgad:=CreateGadgetA(BUTTON_KIND,pgad,^ng,^GTags[0]);
g[8]:=pgad;
ng.ng_LeftEdge:=26*Wbr;
ng.ng_GadgetID:=9;
ng.ng_GadgetText:='_Drucken';
pgad:=CreateGadgetA(BUTTON_KIND,pgad,^ng,^GTags[0]);
g[9]:=pgad;
ng.ng_LeftEdge:=39*Wbr;
ng.ng_GadgetID:=10;
ng.ng_GadgetText:='_Speichern';
pgad:=CreateGadgetA(BUTTON_KIND,pgad,^ng,^GTags[0]);
g[10]:=pgad;
ng.ng_LeftEdge:=52*Wbr;
ng.ng_GadgetID:=11;
ng.ng_GadgetText:='_Neu';
pgad:=CreateGadgetA(BUTTON_KIND,pgad,^ng,^GTags[0]);
g[11]:=pgad;
ng.ng_LeftEdge:=65*Wbr;
ng.ng_GadgetID:=12;
ng.ng_GadgetText:='_Ende';
pgad:=CreateGadgetA(BUTTON_KIND,pgad,^ng,^GTags[0]);
g[12]:=pgad;
titel:='Cheque 2.06 © & P by Falk Zühlsdorff (PackMAN) 29.06.94';
NWTags[1] :=Tagitem(wa_left,0);
NWTags[2] :=Tagitem(wa_top,0);
NWTags[3] :=Tagitem(wa_width,Winbreite);
NWTags[4] :=Tagitem(wa_height,ScrTextFont+16*ysize);
NWTags[5] :=Tagitem(wa_activate,ord(true));
NWTags[6] :=Tagitem(wa_smartrefresh,ord(true));
NWTags[7] :=Tagitem(wa_rmbtrap,ord(true));
NWTags[8] :=Tagitem(wa_title,long(^titel));
NWTags[9]:=Tagitem(wa_Flags,WFLG_CLOSEGADGET+WFLG_DEPTHGADGET+
WFLG_DRAGBAR);
NWTags[10]:=Tagitem(wa_idcmp,IDCMP_GADGETUP+IDCMP_RAWKEY+
IDCMP_CLOSEWINDOW);
NWTags[11] :=Tagitem(wa_Gadgets,long(glist));
NWTags[12]:=Tagitem(tag_done,0);
Win:=openwindowtaglist(nil,^NWTags[1]);
IF Win<>NIL THEN
BEGIN
RP:=Win^.RPort;
ourfont:=setfont(RP,font);
ex:=false;
REPEAT
Msg:=Wait_Port(Win^.UserPort);
Msg:=GT_GetIMsg(Win^.UserPort);
IF Msg<>NIL THEN
BEGIN
GT_ReplyIMsg(Msg);
CASE Msg^.Class OF
IDCMP_CLOSEWINDOW: ex:=true;
IDCMP_GADGETUP:
BEGIN
Akt:=Msg^.IAddress;
CASE AKT^.GADGETID OF
0..5: BEGIN i:=AKT^.GADGETID+1;
strakt:=ACTIVATEGADGET(g[i],Win,NIL);
END;
7: Cycle(2);
8: InfoLine;
9: Drucken;
10: Speichern;
11: Neu;
12: ex:=true;
ELSE;END;
END;
IDCMP_RAWKEY:
BEGIN
CASE Msg^.code OF
$11: strakt:=ACTIVATEGADGET(g[0],Win,NIL); {W}
$20: strakt:=ACTIVATEGADGET(g[1],Win,NIL); {A}
$2A: strakt:=ACTIVATEGADGET(g[2],Win,NIL); {Ä}
$35: strakt:=ACTIVATEGADGET(g[3],Win,NIL); {B}
$18: strakt:=ACTIVATEGADGET(g[4],Win,NIL); {o}
$14: strakt:=ACTIVATEGADGET(g[5],Win,NIL); {T}
$13: strakt:=ACTIVATEGADGET(g[6],Win,NIL); {R}
$34: Cycle(1); {V}
$17: InfoLine;
$22: Drucken;
$21: Speichern;
$36: Neu;
$12,
$45: ex:=true;
ELSE;END;
END;
ELSE;END;
END;
UNTIL ex;
CloseWindow(Win);
END
ELSE RT:=RTReq('Cheque 2.06','Kann Oberfläche nicht darstellen.',
'_Argh',4);
FreeGadgets(glist);
FreeVisualInfo(vi);
CloseSomeLibs;
IF Gadtoolsbase<>NIL THEN CloseLib(Gadtoolsbase);
help:=CloseUtility;
END;
END;
END;
{********************************** MAIN *********************************}
BEGIN
cycleNr:=0;
STx[4]:='';STx[6]:=''; {Argh}
help:=getbattclockL;
IF battclockdate<>'' THEN STx[5]:=battclockdate ELSE STx[5]:='';
Laden;
InitWin;
END.